"""
方法对象：不带()的方法描述

方法对象的概念还是有点抽象的，需要多次反复理解

参考文档: https://docs.python.org/zh-cn/3/tutorial/classes.html#method-objects

类的方法和数据属性一样，调用形式如下
    obj.funcname(parameters)

"""

class Counter:
    """
    简单的计数器实现
    """

    counter = 0

    def getCounter(this):
        """返回counter"""
        return this.counter

    def incrementCounter(this):
        this.counter += 1
        return this.counter

def testObjFun():
    """方法对象"""

    # 类的属性引用之一就包含对方法的引用，但是方法是属于类的函数
    # 在Py中，方法不是类实例独有的，其他类对象也是可以有方法的，例如list对象的append方法
    # 下面的例子中，我们只讨论类实例对象的方法，而不是一般的方法

    # 需要注意的是，obj.func() 和Class.func()是不一样的
    # obj.func是方法对象，一个是函数对象,注意是func，而不是func()

    # 通常，方法会在绑定后立即被调用，如下所示
    obj = Counter()
    # obj.getCounter会立即被调用
    print(obj.getCounter())

    # 方法对象其实可以被保存起来再使用, 如下所示
    getRes = obj.getCounter
    print(getRes())

    # 当一个函数被调用的时候，到底发生了什么；
    # 调用getCounter的时候并没使用参数，虽然定义的时候带了一个参数，一般不带参数调用参数是会引发异常的
    # 方法的特殊点就是实例对象会作为第一个参数被传入函数，也就是self
    # 当一个实例的非数据属性被引用的时候，将会搜索实例所属的类

testObjFun()
